package main

import (
	"fmt"
	"net"
	"strings"
)

func main() {
	//创建监听
	ip := "127.0.0.1"
	port := 8888
	address := fmt.Sprintf("%s:%d", ip, port)
	//net.Listen("tcp", address)
	//net.Listen("tcp", ":8888") //简写，冒号前面默认是本机: 127.0.0.1
	listener, err := net.Listen("tcp", address)
	if err != nil {
		fmt.Println("net.Listen err: ", err)
		return
	}
	defer listener.Close()

	// server可以接收多个连接 ==== 主go程负责监听，子go程负责数据处理
	// 每个连接可以接收处理多轮数据请求

	for {
		fmt.Println("监听中...")

		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("listener.Accept err:", err)
			return
		}

		fmt.Println("连接建立成功!")

		go handleFunc(conn)
	}
}

//处理具体业务的逻辑，需要将conn传递进来，每一新连接，conn是不同的
func handleFunc(conn net.Conn) {
	for {
		//创建一个容器，用于接收读取到的数据
		buf := make([]byte, 1024) //使用make来创建切片，byte ====> uint8

		//Read(b []byte) (n int, err error)
		//cnt: 真正读取client发来的数据
		cnt, err := conn.Read(buf)
		if err != nil {
			fmt.Println("conn.Read err:", err)
			return
		}

		fmt.Println("Client send to Server, 长度:", cnt, "数据:", string(buf[0:cnt]))
		//将数据转成大写
		upperData := strings.ToUpper(string(buf[0:cnt]))
		//Write(b []byte) (n int, err error)
		cnt, err = conn.Write([]byte(upperData))
		if err != nil {
			fmt.Println("conn.Write failee,err: ", err)
		}

		fmt.Println("server send to client, 长度:", cnt, "数据upperData: ", upperData)
	}

	//关闭连接
	_ = conn.Close()
}
